package com.test45_JUC;

import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

public class Demo05_ThreadLocalRandom {

    public static void main(String[] args) {
        // test1();
        test2();
    }

    /**
     * 由于所有的线程都访问同一个Random，那么最终所表现的结果就说共享了同一个随机因子的数据，而这个随机因子是用于控制随机数生成的
     */
    public static void test1() {
        Random random = new Random();
        for (int x = 0; x < 3; x++) {
            new Thread(() -> {
                for (int y = 0; y < 3; y++) {
                    System.out.printf("【%s】【%d】生产随机数：%d%n", Thread.currentThread().getName(), y,
                            random.nextInt(100));
                }
            }, "随机数生成线程-"+x).start();
        }
    }

    /**
     * 如果希望每一个线程独享自己的随机因子，就要使用ThreadLocalRandom类来实现
     * 相比较Random操作来讲，它可以针对于每一个不同的线程保存各自的因子，从而实现准确的随机数随机数生成
     * 这种机制等同于每一个线程保存一个Random
     */
    public static void test2() {
        for (int x = 0; x < 3; x++) {
            new Thread(() -> {
                for (int y = 0; y < 3; y++) {
                    System.out.printf("【%s】【%d】生产随机数：%d%n", Thread.currentThread().getName(), y,
                            ThreadLocalRandom.current().nextInt(100));
                }
            }, "随机数生成线程-"+x).start();
        }
    }
}
